export default {
	// 开启命名空间
	// 通过模块名才能访问到具体的方法
	// 不开启命名空间，使用mutations、actions里面的方法的时候
	// 可以直接访问
	namespaced: true,
	// store.commit('module/method')
	// store.commit('method')
	state: () => ({
		// 购物车的数组，用来存储购物车中每个商品的信息对象
		// 每个商品的信息对象，都包含如下 6 个属性：
		// { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
		cart: JSON.parse(uni.getStorageSync('cart') || '[]'), // []
	}),
	mutations: {
		/**
		 * @param {Object} state vuex里面的state
		 * @param {Object} goods 商品的对象
		 */
		addCart(state, goods) {
			// 实现加入购物车的逻辑
			// 1、判断仓库里面是否有这个商品
			// const isIncludes = state.cart.some(item => item.goods_id === goods.goods_id)
			// 如果存在的时候获取到仓库里面的商品对象
			// 查找数组里面的某一个成员
			// filter > 满足条件的新数组
			// findIndex > 满足条件的数组成员 indexOf
			// some > includes
			const currentGood = state.cart.find(item => item.goods_id === goods.goods_id);
			if (currentGood) {
				currentGood.goods_count++
			} else {
				state.cart.push(goods)
			}
			// 购物车的数据发生变化，重新存本地存储
			this.commit('m_cart/saveStorage')
		},
		saveStorage(state) {
			// 把当前state里面的cart存储到本地存储
			uni.setStorageSync('cart', JSON.stringify(state.cart))
		},
		// 定义修改状态的方法
		changeGoodsState(state, goods) {
			// {goods_id, goods_state}
			state.cart.forEach(item => {
				if (item.goods_id === goods.goods_id) {
					// 招到了当前点击切换的商品对象、
					// 只需要将当前商品的状态覆盖即可
					item.goods_state = goods.goods_state
					// 已经修改了商品的状态
					// 持久化存储到本地
					this.commit('m_cart/saveStorage')
				}
			})
		},
		updateGoodsCount(state, goods) {
			// 1先找到id对应的商品
			// 2/把商品的数量修改成goods.goods_count
			state.cart.forEach(item => {
				if (item.goods_id === goods.goods_id) {
					// 修改数量
					item.goods_count = goods.goods_count
					// 持久化存储
					this.commit('m_cart/saveStorage')
				}
			})
		},
		removeGoodsItem(state, goods) {
			// 先找到这个商品
			// 然后删除
			state.cart = state.cart.filter(item => item.goods_id !== goods.goods_id)
			// 数据修改了
			this.commit('m_cart/saveStorage')
		},
		// 点击全选按钮的时候，动态切换其他购物车子项的状态变化
		updateAllGoodsState(state, newState) {
			// 让购物车里面所有的商品的状态等于newState
			state.cart.forEach(item => item.goods_state = newState)
			// 同步到本地存储 -> 实现持久化
			this.commit('m_cart/saveStorage')
		}
	},
	getters: {
		// 所有的商品的数量，用于购物车角标的展示
		total(state) {
			// cart数组里面的所有的goods_count累加
			// reduce
			// prev: 第一次循环遍历的时候是多少？=>  初始值，后续循环遍历 prev -> 上一个循环遍历返回的结果
			return state.cart.reduce((prev, curr, index, arr) => prev + curr.goods_count, 0)
		},
		// 选中商品的数量，用户结算组件的按钮展示用的
		checkedCount(state) {
			// 计算得出所有选中的商品数量
			return state.cart.reduce((prev, curr, index, arr) => {
				// 怎么判断选中的商品？
				if (curr.goods_state) {
					// 如果当前商品是选中的，那就跟当前商品的数量进行累加
					return prev + curr.goods_count
				}
				// 如果当前商品没有选中的情况下，直接return上一次计算的结果就可以
				return prev
				// 能不能计算选中的商品的数量
			}, 0)
		},
		checkedPrice(state) {
			// 所有选中商品的价格总和 (单价*数量)
			return state.cart.reduce((prev, curr, index, arr) => {
				// 先判断是否选中，选中的时候再去累加
				if (curr.goods_state) {
					return prev + curr.goods_count * curr.goods_price;
				}
				return prev
			}, 0).toFixed(2) // 保留两位小数
		}
	}
}

// const arr = [3, 4, 56]
// const res = arr.reduce((prev, current, index, arr) => {
//   // prev第一次循环的时候，是我们传入的初始值
//   // 二次上一次循环遍历返回的结果
//   return prev + current
// }, 0)
// console.log(res);
